package partTwo;
public class TestOuter {
    public static void main(String[] args) {
        //普通内部类调用
        /*
         * 此前我们测试了如何在内部类与外部类中互相调用资源
         * 在其它类中，我们可以直接创建外部类的对象调用外部类资源
         * 那么在其它类中，怎么使用内部类的资源呢?
         * 同样也是创建对象调用，我们需要通过外部类对象来创建内部类对象
         */
        Outter.Inner inner = new Outter().new Inner();
        System.out.println("通过外部类对象创建内部类对象，调用内部类资源"+inner.innerString);
        //System.out.println("在外部类中创建内部类对象，调用内部类资源"+inner.innerPrivateString);
        System.out.println("通过外部类对象创建内部类对象，调用内部类资源");
        inner.innerFind();
        //inner.innerPrivateFind();

        /*
         * 我们测试后发现，在其它类中，并不能通过创建对象直接调用内部类的私有资源
         * 此时我们可以在外部类中，创建调用内部类私有资源的方法
         * 间接调用内部类的私有资源
         * 需要注意的是，这里我们只做资源调用的测试，因为在Outter()中的getInnerPrivateMethod()方法中new 了一个Inner()对象，但是
         */
        Outter outter = new Outter();
        outter.getInnerPrivateMethod();

        /* 要注意的是，这里我们只做资源调用的测试，
         *  因为在Outter()类中的getInnerPrivateMethod()方法中new了一个Inner()对象，并调用了Inner()类中的innerPrivateFind()方法；
         * 在innerPrivateFind()方法中，我们调用了outFind()方法，在outFind()方法中，我们又new了一个Inner()对象，并再次调用了innerPrivateFind()方法；
         * 这样接下来就会反复的执行这样的闭环调用，导致出现死循环，在日常的开发中，我们要避免出现这样的问题，这里因为是演示，所以不便将代码拆分开来
         */

        //静态内部类调用
        /*
         * 但是对于被static修饰的内部类，是无法通过new一个对象来创建内部类对象的
         * 此时我们需要通过外部类的类名来创建内部类对象
         */
        Outter.InnerStatic innerStatic = new Outter.InnerStatic();
        System.out.println("通过外部类类名创建内部类对象，调用内部类资源"+innerStatic.innerString);
        System.out.println("通过外部类类名创建内部类对象，调用内部类资源"+innerStatic.innerStaticString);//静态成员变量可以调用，但是IDEA不会提示输入，其认为这不是调用的最好方式
        System.out.println("通过外部类类名创建内部类对象，调用内部类资源");
        innerStatic.innerFind();
        innerStatic.innerStaticFind();//静态成员变量可以调用，但是IDEA不会提示输入，其认为这不是调用的最好方式

        /*
         * 对于静态资源我们前边有过了解，其是可以通过类名直接调用的，所以我们这里通过对象调用IDEA不会提示
         * 其认为这不是调用此资源最优美的方式,
         * 我们可以通过类名直接调用，这里我们尝试使用匿名内部类的链式加载进行调用
         */
        System.out.println("通过类名的链式加载调用被static修饰的资源"+Outter.InnerStatic.innerStaticString);
        Outter.InnerStatic.innerStaticFind();

        System.out.println("通过匿名内部类调用静态内部类的普通资源"+new Outter.InnerStatic().innerString);
        new Outter.InnerStatic().innerFind();

        //私有内部类调用
        /*
         * 对于被private修饰的内部类是无法直接创建对象访问的
         * 和此前内部类外部类互相调用资源一样，需要在外部类中创建调用私有内部类的方法
         * 通过此方法间接调用私有内部类，这里不在重复介绍
         */
    }
}

